{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Link prediction example and calibration: GraphSAGE on the PubMed-Diabetes citation dataset"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In this example, we use our implementation of the [GraphSAGE](http://snap.stanford.edu/graphsage/) algorithm to build a model that predicts citation links in the PubMed-Diabetes dataset (see below). The problem is treated as a supervised link prediction problem on a homogeneous citation network with nodes representing papers (with attributes such as binary keyword indicators and categorical subject) and links corresponding to paper-paper citations. \n",
    "\n",
    "To address this problem, we build a model with the following architecture. First we build a two-layer GraphSAGE model that takes labeled `(paper1, paper2)` node pairs corresponding to possible citation links, and outputs a pair of node embeddings for the `paper1` and `paper2` nodes of the pair. These embeddings are then fed into a link classification layer, which first applies a binary operator to those node embeddings (e.g., concatenating them) to construct the embedding of the potential link. Thus obtained link embeddings are passed through the dense link classification layer to obtain link predictions - probability for these candidate links to actually exist in the network. The entire model is trained end-to-end by minimizing the loss function of choice (e.g., binary cross-entropy between predicted link probabilities and true link labels, with true/false citation links having labels 1/0) using stochastic gradient descent (SGD) updates of the model parameters, with minibatches of 'training' links fed into the model.\n",
    "\n",
    "Lastly, we investigate the nature of prediction probabilities. We want to know if GraphSAGE's prediction probabilities are well calibrated or not. In the latter case, we present two methods for calibrating the model's output.\n",
    "\n",
    "**References**\n",
    "\n",
    "1. Inductive Representation Learning on Large Graphs. W.L. Hamilton, R. Ying, and J. Leskovec arXiv:1706.02216 \n",
    "[cs.SI], 2017. ([link](http://snap.stanford.edu/graphsage/))\n",
    "\n",
    "2. On Calibration of Modern Neural Networks. C. Guo, G. Pleiss, Y. Sun, and K. Q. Weinberger. \n",
    "ICML 2017. ([link](https://geoffpleiss.com/nn_calibration))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import networkx as nx\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import itertools\n",
    "import os\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "import stellargraph as sg\n",
    "from stellargraph.data import EdgeSplitter\n",
    "from stellargraph.mapper import GraphSAGELinkGenerator\n",
    "from stellargraph.layer import GraphSAGE, link_classification\n",
    "from stellargraph import expected_calibration_error, plot_reliability_diagram\n",
    "from stellargraph import IsotonicCalibration, TemperatureCalibration\n",
    "\n",
    "from tensorflow import keras\n",
    "from sklearn import preprocessing, feature_extraction, model_selection\n",
    "from sklearn.calibration import calibration_curve\n",
    "from sklearn.isotonic import IsotonicRegression\n",
    "\n",
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "from stellargraph import globalvar\n",
    "from stellargraph import datasets\n",
    "from IPython.display import display, HTML\n",
    "\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Loading the PubMed Diabetes network data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "The PubMed Diabetes dataset consists of 19717 scientific publications from PubMed database pertaining to diabetes classified into one of three classes. The citation network consists of 44338 links. Each publication in the dataset is described by a TF/IDF weighted word vector from a dictionary which consists of 500 unique words."
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "dataset = datasets.PubMedDiabetes()\n",
    "display(HTML(dataset.description))\n",
    "dataset.download()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Load the graph from edgelist"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "edgelist = pd.read_csv(\n",
    "    os.path.join(dataset.data_directory, \"Pubmed-Diabetes.DIRECTED.cites.tab\"),\n",
    "    sep=\"\\t\",\n",
    "    skiprows=2,\n",
    "    header=None,\n",
    ")\n",
    "edgelist.drop(columns=[0, 2], inplace=True)\n",
    "edgelist.columns = [\"source\", \"target\"]\n",
    "# delete unneccessary prefix\n",
    "edgelist[\"source\"] = edgelist[\"source\"].map(lambda x: x.lstrip(\"paper:\"))\n",
    "edgelist[\"target\"] = edgelist[\"target\"].map(lambda x: x.lstrip(\"paper:\"))\n",
    "edgelist[\"label\"] = \"cites\"  # set the edge type"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>source</th>\n",
       "      <th>target</th>\n",
       "      <th>label</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>19127292</td>\n",
       "      <td>17363749</td>\n",
       "      <td>cites</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>19668377</td>\n",
       "      <td>17293876</td>\n",
       "      <td>cites</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1313726</td>\n",
       "      <td>3002783</td>\n",
       "      <td>cites</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>19110882</td>\n",
       "      <td>14578298</td>\n",
       "      <td>cites</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>18606979</td>\n",
       "      <td>10333910</td>\n",
       "      <td>cites</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     source    target  label\n",
       "0  19127292  17363749  cites\n",
       "1  19668377  17293876  cites\n",
       "2   1313726   3002783  cites\n",
       "3  19110882  14578298  cites\n",
       "4  18606979  10333910  cites"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "edgelist.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "G = nx.from_pandas_edgelist(edgelist, edge_attr=\"label\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Load the features and subject for the nodes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "nodes_as_dict = []\n",
    "with open(os.path.join(dataset.data_directory, \"Pubmed-Diabetes.NODE.paper.tab\")) as fp:\n",
    "    for line in itertools.islice(fp, 2, None):\n",
    "        line_res = line.split(\"\\t\")\n",
    "        pid = line_res[0]\n",
    "        feat_name = [\"pid\"] + [l.split(\"=\")[0] for l in line_res[1:]][\n",
    "            :-1\n",
    "        ]  # delete summary\n",
    "        feat_value = [l.split(\"=\")[1] for l in line_res[1:]][:-1]  # delete summary\n",
    "        feat_value = [pid] + [float(x) for x in feat_value]  # change to numeric from str\n",
    "        row = dict(zip(feat_name, feat_value))\n",
    "        nodes_as_dict.append(row)\n",
    "\n",
    "# Create a Pandas dataframe holding the node data\n",
    "node_data = pd.DataFrame(nodes_as_dict)\n",
    "node_data.fillna(0, inplace=True)\n",
    "node_data[\"label\"] = node_data[\"label\"].astype(int)\n",
    "node_data[\"label\"] = node_data[\"label\"].astype(str)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>pid</th>\n",
       "      <th>label</th>\n",
       "      <th>w-rat</th>\n",
       "      <th>w-common</th>\n",
       "      <th>w-use</th>\n",
       "      <th>w-examin</th>\n",
       "      <th>w-pathogenesi</th>\n",
       "      <th>w-retinopathi</th>\n",
       "      <th>w-mous</th>\n",
       "      <th>w-studi</th>\n",
       "      <th>...</th>\n",
       "      <th>w-kidney</th>\n",
       "      <th>w-urinari</th>\n",
       "      <th>w-myocardi</th>\n",
       "      <th>w-meal</th>\n",
       "      <th>w-ica</th>\n",
       "      <th>w-locus</th>\n",
       "      <th>w-tcell</th>\n",
       "      <th>w-depress</th>\n",
       "      <th>w-bone</th>\n",
       "      <th>w-mutat</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>12187484</td>\n",
       "      <td>1</td>\n",
       "      <td>0.093935</td>\n",
       "      <td>0.028698</td>\n",
       "      <td>0.011760</td>\n",
       "      <td>0.019375</td>\n",
       "      <td>0.063161</td>\n",
       "      <td>0.170891</td>\n",
       "      <td>0.067702</td>\n",
       "      <td>0.017555</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2344352</td>\n",
       "      <td>1</td>\n",
       "      <td>0.023618</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.014784</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>14654069</td>\n",
       "      <td>1</td>\n",
       "      <td>0.102263</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.010669</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>16443886</td>\n",
       "      <td>2</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2684155</td>\n",
       "      <td>1</td>\n",
       "      <td>0.030616</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 502 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "        pid label     w-rat  w-common     w-use  w-examin  w-pathogenesi  \\\n",
       "0  12187484     1  0.093935  0.028698  0.011760  0.019375       0.063161   \n",
       "1   2344352     1  0.023618  0.000000  0.014784  0.000000       0.000000   \n",
       "2  14654069     1  0.102263  0.000000  0.010669  0.000000       0.000000   \n",
       "3  16443886     2  0.000000  0.000000  0.000000  0.000000       0.000000   \n",
       "4   2684155     1  0.030616  0.000000  0.000000  0.000000       0.000000   \n",
       "\n",
       "   w-retinopathi    w-mous   w-studi  ...  w-kidney  w-urinari  w-myocardi  \\\n",
       "0       0.170891  0.067702  0.017555  ...       0.0        0.0         0.0   \n",
       "1       0.000000  0.000000  0.000000  ...       0.0        0.0         0.0   \n",
       "2       0.000000  0.000000  0.000000  ...       0.0        0.0         0.0   \n",
       "3       0.000000  0.000000  0.000000  ...       0.0        0.0         0.0   \n",
       "4       0.000000  0.000000  0.000000  ...       0.0        0.0         0.0   \n",
       "\n",
       "   w-meal  w-ica  w-locus  w-tcell  w-depress  w-bone  w-mutat  \n",
       "0     0.0    0.0      0.0      0.0        0.0     0.0      0.0  \n",
       "1     0.0    0.0      0.0      0.0        0.0     0.0      0.0  \n",
       "2     0.0    0.0      0.0      0.0        0.0     0.0      0.0  \n",
       "3     0.0    0.0      0.0      0.0        0.0     0.0      0.0  \n",
       "4     0.0    0.0      0.0      0.0        0.0     0.0      0.0  \n",
       "\n",
       "[5 rows x 502 columns]"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "node_data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>w-rat</th>\n",
       "      <th>w-common</th>\n",
       "      <th>w-use</th>\n",
       "      <th>w-examin</th>\n",
       "      <th>w-pathogenesi</th>\n",
       "      <th>w-retinopathi</th>\n",
       "      <th>w-mous</th>\n",
       "      <th>w-studi</th>\n",
       "      <th>w-anim</th>\n",
       "      <th>w-model</th>\n",
       "      <th>...</th>\n",
       "      <th>w-kidney</th>\n",
       "      <th>w-urinari</th>\n",
       "      <th>w-myocardi</th>\n",
       "      <th>w-meal</th>\n",
       "      <th>w-ica</th>\n",
       "      <th>w-locus</th>\n",
       "      <th>w-tcell</th>\n",
       "      <th>w-depress</th>\n",
       "      <th>w-bone</th>\n",
       "      <th>w-mutat</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>pid</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>12187484</th>\n",
       "      <td>0.093935</td>\n",
       "      <td>0.028698</td>\n",
       "      <td>0.011760</td>\n",
       "      <td>0.019375</td>\n",
       "      <td>0.063161</td>\n",
       "      <td>0.170891</td>\n",
       "      <td>0.067702</td>\n",
       "      <td>0.017555</td>\n",
       "      <td>0.098402</td>\n",
       "      <td>0.062691</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2344352</th>\n",
       "      <td>0.023618</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.014784</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.030926</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14654069</th>\n",
       "      <td>0.102263</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.010669</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.044636</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16443886</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.038715</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2684155</th>\n",
       "      <td>0.030616</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.080179</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 500 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "             w-rat  w-common     w-use  w-examin  w-pathogenesi  \\\n",
       "pid                                                               \n",
       "12187484  0.093935  0.028698  0.011760  0.019375       0.063161   \n",
       "2344352   0.023618  0.000000  0.014784  0.000000       0.000000   \n",
       "14654069  0.102263  0.000000  0.010669  0.000000       0.000000   \n",
       "16443886  0.000000  0.000000  0.000000  0.000000       0.000000   \n",
       "2684155   0.030616  0.000000  0.000000  0.000000       0.000000   \n",
       "\n",
       "          w-retinopathi    w-mous   w-studi    w-anim   w-model  ...  \\\n",
       "pid                                                              ...   \n",
       "12187484       0.170891  0.067702  0.017555  0.098402  0.062691  ...   \n",
       "2344352        0.000000  0.000000  0.000000  0.030926  0.000000  ...   \n",
       "14654069       0.000000  0.000000  0.000000  0.044636  0.000000  ...   \n",
       "16443886       0.000000  0.000000  0.000000  0.000000  0.038715  ...   \n",
       "2684155        0.000000  0.000000  0.000000  0.080179  0.000000  ...   \n",
       "\n",
       "          w-kidney  w-urinari  w-myocardi  w-meal  w-ica  w-locus  w-tcell  \\\n",
       "pid                                                                          \n",
       "12187484       0.0        0.0         0.0     0.0    0.0      0.0      0.0   \n",
       "2344352        0.0        0.0         0.0     0.0    0.0      0.0      0.0   \n",
       "14654069       0.0        0.0         0.0     0.0    0.0      0.0      0.0   \n",
       "16443886       0.0        0.0         0.0     0.0    0.0      0.0      0.0   \n",
       "2684155        0.0        0.0         0.0     0.0    0.0      0.0      0.0   \n",
       "\n",
       "          w-depress  w-bone  w-mutat  \n",
       "pid                                   \n",
       "12187484        0.0     0.0      0.0  \n",
       "2344352         0.0     0.0      0.0  \n",
       "14654069        0.0     0.0      0.0  \n",
       "16443886        0.0     0.0      0.0  \n",
       "2684155         0.0     0.0      0.0  \n",
       "\n",
       "[5 rows x 500 columns]"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "node_data.index = node_data[\"pid\"]\n",
    "node_data.drop(columns=[\"pid\", \"label\"], inplace=True)\n",
    "node_data.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Define a set of node features that will be used by the model as the difference between the set of all node features and a list of user-defined node attributes to ignore:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index(['w-rat', 'w-common', 'w-use', 'w-examin', 'w-pathogenesi',\n",
       "       'w-retinopathi', 'w-mous', 'w-studi', 'w-anim', 'w-model',\n",
       "       ...\n",
       "       'w-kidney', 'w-urinari', 'w-myocardi', 'w-meal', 'w-ica', 'w-locus',\n",
       "       'w-tcell', 'w-depress', 'w-bone', 'w-mutat'],\n",
       "      dtype='object', length=500)"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "feature_names = node_data.columns\n",
    "feature_names"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We need to convert node features that will be used by the model to numeric values that are required for GraphSAGE input. Note that all node features in the PubMed dataset, except the categorical \"label\" feature, are already numeric, and don't require the conversion."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "# node features are already numeric, no further conversion is needed\n",
    "node_features = node_data[feature_names].values"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(19717, 500)"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "node_features.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Add node data to G:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "for nid, f in zip(node_data.index, node_features):\n",
    "    G.nodes[str(nid)][globalvar.TYPE_ATTR_NAME] = \"paper\"  # specify node type\n",
    "    G.nodes[str(nid)][\"feature\"] = f"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We aim to train a link prediction model, hence we need to prepare the train and test sets of links and the corresponding graphs with those links removed.\n",
    "\n",
    "We are going to split our input graph into a train and test graphs using the EdgeSplitter class in `stellargraph.data`. We will use the train graph for training the model (a binary classifier that, given two nodes, predicts whether a link between these two nodes should exist or not) and the test graph for evaluating the model's performance on hold out data.\n",
    "Each of these graphs will have the same number of nodes as the input graph, but the number of links will differ (be reduced) as some of the links will be removed during each split and used as the positive samples for training/testing the link prediction classifier."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "From the original graph G, extract a randomly sampled subset of validation edges (true and false citation links) and the reduced graph G_test with the positive test edges removed:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Removed 1000 edges\n",
      "Removed 2000 edges\n",
      "Removed 3000 edges\n",
      "Removed 4000 edges\n",
      "Removed 5000 edges\n",
      "Removed 6000 edges\n",
      "Sampled 1000 negative examples\n",
      "Sampled 2000 negative examples\n",
      "Sampled 3000 negative examples\n",
      "Sampled 4000 negative examples\n",
      "Sampled 5000 negative examples\n",
      "Sampled 6000 negative examples\n",
      "** Sampled 6649 positive and 6649 negative edges. **\n"
     ]
    }
   ],
   "source": [
    "# Define an edge splitter on the original graph G:\n",
    "edge_splitter_test = EdgeSplitter(G)\n",
    "\n",
    "# Randomly sample a fraction p=0.1 of all positive links, and same number of negative links, from G, and obtain the\n",
    "# reduced graph G_test with the sampled links removed:\n",
    "G_test, edge_ids_test, edge_labels_test = edge_splitter_test.train_test_split(\n",
    "    p=0.15, method=\"global\", keep_connected=True\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The reduced graph G_test, together with the test ground truth set of links (edge_ids_test, edge_labels_test), will be used for testing the model.\n",
    "\n",
    "Now repeat this procedure to obtain the validation data for the model. From the reduced graph G_test, extract a randomly sampled subset of validation edges (true and false citation links) and the reduced graph G_val with the positive train edges removed:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Removed 1000 edges\n",
      "Removed 2000 edges\n",
      "Removed 3000 edges\n",
      "Removed 4000 edges\n",
      "Removed 5000 edges\n",
      "Removed 6000 edges\n",
      "Removed 7000 edges\n",
      "Sampled 1000 negative examples\n",
      "Sampled 2000 negative examples\n",
      "Sampled 3000 negative examples\n",
      "Sampled 4000 negative examples\n",
      "Sampled 5000 negative examples\n",
      "Sampled 6000 negative examples\n",
      "Sampled 7000 negative examples\n",
      "** Sampled 7535 positive and 7535 negative edges. **\n"
     ]
    }
   ],
   "source": [
    "# Define an edge splitter on the reduced graph G_test:\n",
    "edge_splitter_val = EdgeSplitter(G_test)\n",
    "\n",
    "# Randomly sample a fraction p=0.1 of all positive links, and same number of negative links, from G_test, and obtain the\n",
    "# reduced graph G_train with the sampled links removed:\n",
    "G_val, edge_ids_val, edge_labels_val = edge_splitter_val.train_test_split(\n",
    "    p=0.20, method=\"global\", keep_connected=True\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The reduced graph G_val, together with the validation ground truth set of links (edge_ids_val, edge_labels_val), will be used for validating the model (can also be used to tune the model parameters).\n",
    "\n",
    "Now repeat this procedure to obtain the training data for the model. From the reduced graph G_val, extract a randomly sampled subset of train edges (true and false citation links) and the reduced graph G_train with the positive train edges removed:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Removed 1000 edges\n",
      "Removed 2000 edges\n",
      "Removed 3000 edges\n",
      "Removed 4000 edges\n",
      "Removed 5000 edges\n",
      "Removed 6000 edges\n",
      "Sampled 1000 negative examples\n",
      "Sampled 2000 negative examples\n",
      "Sampled 3000 negative examples\n",
      "Sampled 4000 negative examples\n",
      "Sampled 5000 negative examples\n",
      "Sampled 6000 negative examples\n",
      "** Sampled 6028 positive and 6028 negative edges. **\n"
     ]
    }
   ],
   "source": [
    "# Define an edge splitter on the reduced graph G_test:\n",
    "edge_splitter_train = EdgeSplitter(G_val)\n",
    "\n",
    "# Randomly sample a fraction p=0.1 of all positive links, and same number of negative links, from G_test, and obtain the\n",
    "# reduced graph G_train with the sampled links removed:\n",
    "G_train, edge_ids_train, edge_labels_train = edge_splitter_train.train_test_split(\n",
    "    p=0.20, method=\"global\", keep_connected=True\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "G_train, together with the train ground truth set of links (edge_ids_train, edge_labels_train), will be used for training the model."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Convert G_val, G_train and G_test to StellarGraph objects (undirected, as required by GraphSAGE) for ML:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "G_val = sg.StellarGraph(G_val, node_features=\"feature\")\n",
    "G_train = sg.StellarGraph(G_train, node_features=\"feature\")\n",
    "G_test = sg.StellarGraph(G_test, node_features=\"feature\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Summary of G_train, G_val and G_test - note that they have the same set of nodes, only differing in their edge sets:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "NetworkXStellarGraph: Undirected multigraph\n",
      " Nodes: 19717, Edges: 24115\n",
      "\n",
      " Node types:\n",
      "  paper: [19717]\n",
      "        Attributes: {'feature'}\n",
      "    Edge types: paper-cites->paper\n",
      "\n",
      " Edge types:\n",
      "    paper-cites->paper: [24115]\n",
      "\n"
     ]
    }
   ],
   "source": [
    "print(G_train.info())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "NetworkXStellarGraph: Undirected multigraph\n",
      " Nodes: 19717, Edges: 30143\n",
      "\n",
      " Node types:\n",
      "  paper: [19717]\n",
      "        Attributes: {'feature'}\n",
      "    Edge types: paper-cites->paper\n",
      "\n",
      " Edge types:\n",
      "    paper-cites->paper: [30143]\n",
      "\n"
     ]
    }
   ],
   "source": [
    "print(G_val.info())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "NetworkXStellarGraph: Undirected multigraph\n",
      " Nodes: 19717, Edges: 37678\n",
      "\n",
      " Node types:\n",
      "  paper: [19717]\n",
      "        Attributes: {'feature'}\n",
      "    Edge types: paper-cites->paper\n",
      "\n",
      " Edge types:\n",
      "    paper-cites->paper: [37678]\n",
      "\n"
     ]
    }
   ],
   "source": [
    "print(G_test.info())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Next, we create the link generators for sampling and streaming train and test link examples to the model. The link generators essentially \"map\" pairs of nodes `(paper1, paper2)` to the input of GraphSAGE: they take minibatches of node pairs, sample 2-hop subgraphs with `(paper1, paper2)` head nodes extracted from those pairs, and feed them, together with the corresponding binary labels indicating whether those pairs represent true or false citation links, to the input layer of the GraphSAGE model, for SGD updates of the model parameters.\n",
    "\n",
    "Specify the minibatch size (number of node pairs per minibatch) and the number of epochs for training the model:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "batch_size = 50\n",
    "epochs = 20  # The number of training epochs for training the GraphSAGE model."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "\n",
    "Specify the sizes of 1- and 2-hop neighbour samples for GraphSAGE:\n",
    "\n",
    "Note that the length of `num_samples` list defines the number of layers/iterations in the GraphSAGE model. In this example, we are defining a 2-layer GraphSAGE model."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [],
   "source": [
    "num_samples = [10, 5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_gen = GraphSAGELinkGenerator(G_train, batch_size, num_samples)\n",
    "val_gen = GraphSAGELinkGenerator(G_val, batch_size, num_samples)\n",
    "test_gen = GraphSAGELinkGenerator(G_test, batch_size, num_samples)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "GraphSAGE part of the model, with hidden layer sizes of 50 for both GraphSAGE layers, a bias term, and dropout.\n",
    "\n",
    "Note that the length of layer_sizes list must be equal to the length of num_samples, as len(num_samples) defines the number of hops (layers) in the GraphSAGE model."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "layer_sizes = [32, 32]\n",
    "graphsage = GraphSAGE(\n",
    "    layer_sizes=layer_sizes, generator=train_gen, bias=True, dropout=0.2\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Build the model and expose input and output sockets of graphsage, for node pair inputs:\n",
    "x_inp, x_out = graphsage.build()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Final link classification layer that takes a pair of node embeddings produced by graphsage, applies a binary operator to them to produce the corresponding link embedding ('ip' for inner product; other options for the binary operator can be seen by running a cell with `?link_classification` in it), and passes it through a dense layer:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "link_classification: using 'ip' method to combine node embeddings into edge embeddings\n"
     ]
    }
   ],
   "source": [
    "logits = link_classification(\n",
    "    output_dim=1, output_act=\"linear\", edge_embedding_method=\"ip\"\n",
    ")(x_out)\n",
    "\n",
    "prediction = keras.layers.Activation(keras.activations.sigmoid)(logits)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Stack the GraphSAGE and prediction layers into a Keras model, and specify the loss"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "model = keras.Model(inputs=x_inp, outputs=prediction)\n",
    "\n",
    "model.compile(\n",
    "    optimizer=keras.optimizers.Adam(lr=1e-3),\n",
    "    loss=keras.losses.binary_crossentropy,\n",
    "    metrics=[keras.metrics.binary_accuracy],\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Evaluate the initial (untrained) model on the train, val and test sets:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [],
   "source": [
    "train_flow = train_gen.flow(edge_ids_train, edge_labels_train, shuffle=True)\n",
    "val_flow = val_gen.flow(edge_ids_val, edge_labels_val)\n",
    "test_flow = test_gen.flow(edge_ids_test, edge_labels_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Train Set Metrics of the initial (untrained) model:\n",
      "\tloss: 0.6716\n",
      "\tbinary_accuracy: 0.5384\n",
      "\n",
      "Validation Set Metrics of the initial (untrained) model:\n",
      "\tloss: 0.6698\n",
      "\tbinary_accuracy: 0.5328\n",
      "\n",
      "Test Set Metrics of the initial (untrained) model:\n",
      "\tloss: 0.6690\n",
      "\tbinary_accuracy: 0.5338\n"
     ]
    }
   ],
   "source": [
    "init_train_metrics = model.evaluate_generator(train_flow)\n",
    "init_val_metrics = model.evaluate_generator(val_flow)\n",
    "init_test_metrics = model.evaluate_generator(test_flow)\n",
    "\n",
    "print(\"\\nTrain Set Metrics of the initial (untrained) model:\")\n",
    "for name, val in zip(model.metrics_names, init_train_metrics):\n",
    "    print(\"\\t{}: {:0.4f}\".format(name, val))\n",
    "\n",
    "print(\"\\nValidation Set Metrics of the initial (untrained) model:\")\n",
    "for name, val in zip(model.metrics_names, init_val_metrics):\n",
    "    print(\"\\t{}: {:0.4f}\".format(name, val))\n",
    "\n",
    "print(\"\\nTest Set Metrics of the initial (untrained) model:\")\n",
    "for name, val in zip(model.metrics_names, init_test_metrics):\n",
    "    print(\"\\t{}: {:0.4f}\".format(name, val))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Train the model:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [],
   "source": [
    "history = model.fit_generator(\n",
    "    train_flow, epochs=epochs, validation_data=val_flow, verbose=0, shuffle=True,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Plot the training history:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot_history(history):\n",
    "    metrics = sorted(history.history.keys())\n",
    "    metrics = metrics[: len(metrics) // 2]\n",
    "    for m in metrics:\n",
    "        # summarize history for metric m\n",
    "        plt.plot(history.history[m])\n",
    "        plt.plot(history.history[\"val_\" + m])\n",
    "        plt.title(m)\n",
    "        plt.ylabel(m)\n",
    "        plt.xlabel(\"epoch\")\n",
    "        plt.legend([\"train\", \"test\"], loc=\"upper right\")\n",
    "        plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_history(history)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Evaluate the trained model on test citation links:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Train Set Metrics of the trained model:\n",
      "\tloss: 0.4665\n",
      "\tbinary_accuracy: 0.8768\n",
      "\n",
      "Validation Set Metrics of the trained model:\n",
      "\tloss: 0.5655\n",
      "\tbinary_accuracy: 0.7257\n",
      "\n",
      "Test Set Metrics of the trained model:\n",
      "\tloss: 0.5603\n",
      "\tbinary_accuracy: 0.7301\n"
     ]
    }
   ],
   "source": [
    "train_metrics = model.evaluate_generator(train_flow)\n",
    "val_metrics = model.evaluate_generator(val_flow)\n",
    "test_metrics = model.evaluate_generator(test_flow)\n",
    "\n",
    "print(\"\\nTrain Set Metrics of the trained model:\")\n",
    "for name, val in zip(model.metrics_names, train_metrics):\n",
    "    print(\"\\t{}: {:0.4f}\".format(name, val))\n",
    "\n",
    "print(\"\\nValidation Set Metrics of the trained model:\")\n",
    "for name, val in zip(model.metrics_names, val_metrics):\n",
    "    print(\"\\t{}: {:0.4f}\".format(name, val))\n",
    "\n",
    "print(\"\\nTest Set Metrics of the trained model:\")\n",
    "for name, val in zip(model.metrics_names, test_metrics):\n",
    "    print(\"\\t{}: {:0.4f}\".format(name, val))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [],
   "source": [
    "num_tests = 1  # the number of times to generate predictions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "266/266 [==============================] - 19s 72ms/step\n"
     ]
    }
   ],
   "source": [
    "all_test_predictions = [\n",
    "    model.predict_generator(test_flow, verbose=True) for _ in np.arange(num_tests)\n",
    "]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Diagnosing model miscalibration\n",
    "\n",
    "We are going to use method from scikit-learn.calibration module to calibrate the binary classifier."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [],
   "source": [
    "calibration_data = [\n",
    "    calibration_curve(\n",
    "        y_prob=test_predictions, y_true=edge_labels_test, n_bins=10, normalize=True\n",
    "    )\n",
    "    for test_predictions in all_test_predictions\n",
    "]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let' calculate the expected calibration error on the test set before calibration."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ECE: (before calibration) 0.3479\n"
     ]
    }
   ],
   "source": [
    "for fraction_of_positives, mean_predicted_value in calibration_data:\n",
    "    ece_pre_calibration = expected_calibration_error(\n",
    "        prediction_probabilities=all_test_predictions[0],\n",
    "        accuracy=fraction_of_positives,\n",
    "        confidence=mean_predicted_value,\n",
    "    )\n",
    "    print(\"ECE: (before calibration) {:.4f}\".format(ece_pre_calibration))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now let's plot the reliability diagram. This is a visual aid for the diagnosis of a poorly calibrated binary classifier."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x576 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_reliability_diagram(\n",
    "    calibration_data, np.array(all_test_predictions[0]), ece=[ece_pre_calibration]\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Model Calibration \n",
    "\n",
    "Next, we are going to use our validation set to calibrate the model.\n",
    "\n",
    "We will consider two different approaches for calibrating a binary classifier, Platt scaling and Isotonic regression.\n",
    "\n",
    "### Platt Scaling\n",
    "\n",
    "$q_i = \\sigma(\\alpha z_i+\\beta)$ where $z_i$ is the GraphSAGE output (before the last layer's activation function is applied), $q_i$ is the calibrated probability, and $\\sigma()$ is the sigmoid function. \n",
    "\n",
    "$\\alpha$ and $\\beta$ are the model's trainable parameters.\n",
    "\n",
    "For more information see:\n",
    "- https://en.wikipedia.org/wiki/Platt_scaling\n",
    "\n",
    "### Isotonic Regression\n",
    "\n",
    "Isotonic Regression is a regression technique that fits a piece-wise, non-decreasing, linear function to data. For more information see:\n",
    "- https://scikit-learn.org/stable/modules/generated/sklearn.isotonic.IsotonicRegression.html#sklearn.isotonic.IsotonicRegression\n",
    "- https://en.wikipedia.org/wiki/Isotonic_regression"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Select the calibration method."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [],
   "source": [
    "use_platt = False  # True for Platt scaling or False for Isotonic Regression"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "For simplicity, we are going to calibrate using a single prediction per query point."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [],
   "source": [
    "num_tests = 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [],
   "source": [
    "score_model = keras.Model(inputs=x_inp, outputs=logits)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "302/302 [==============================] - 21s 70ms/step\n",
      "266/266 [==============================] - 19s 73ms/step\n"
     ]
    }
   ],
   "source": [
    "if use_platt:\n",
    "    all_val_score_predictions = [\n",
    "        score_model.predict_generator(val_flow, verbose=True)\n",
    "        for _ in np.arange(num_tests)\n",
    "    ]\n",
    "    all_test_score_predictions = [\n",
    "        score_model.predict_generator(test_flow, verbose=True)\n",
    "        for _ in np.arange(num_tests)\n",
    "    ]\n",
    "    all_test_probabilistic_predictions = [\n",
    "        model.predict_generator(test_flow, verbose=True) for _ in np.arange(num_tests)\n",
    "    ]\n",
    "else:\n",
    "    all_val_score_predictions = [\n",
    "        model.predict_generator(val_flow, verbose=True) for _ in np.arange(num_tests)\n",
    "    ]\n",
    "    all_test_probabilistic_predictions = [\n",
    "        model.predict_generator(test_flow, verbose=True) for _ in np.arange(num_tests)\n",
    "    ]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(15070, 1)"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "val_predictions = np.mean(np.array(all_val_score_predictions), axis=0)\n",
    "val_predictions.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [],
   "source": [
    "# These are the uncalibrated prediction probabilities.\n",
    "if use_platt:\n",
    "    test_predictions = np.mean(np.array(all_test_score_predictions), axis=0)\n",
    "    test_predictions.shape\n",
    "else:\n",
    "    test_predictions = np.mean(np.array(all_test_probabilistic_predictions), axis=0)\n",
    "    test_predictions.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [],
   "source": [
    "if use_platt:\n",
    "    # for binary classification this class performs Platt Scaling\n",
    "    lr = TemperatureCalibration()\n",
    "else:\n",
    "    lr = IsotonicCalibration()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((15070, 1), (15070,))"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "val_predictions.shape, edge_labels_val.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [],
   "source": [
    "lr.fit(val_predictions, edge_labels_val)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [],
   "source": [
    "lr_test_predictions = lr.predict(test_predictions)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(13298, 1)"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lr_test_predictions.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's check if these predictions are calibrated!\n",
    "\n",
    "If calibration is successful then the ECE after calibration will be lower and the calibration curve will track the ideal diagonal line more closely."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "calibration_data = [\n",
    "    calibration_curve(\n",
    "        y_prob=lr_test_predictions, y_true=edge_labels_test, n_bins=10, normalize=True\n",
    "    )\n",
    "]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ECE (after calibration): 0.0073\n"
     ]
    }
   ],
   "source": [
    "for fraction_of_positives, mean_predicted_value in calibration_data:\n",
    "    ece_post_calibration = expected_calibration_error(\n",
    "        prediction_probabilities=lr_test_predictions,\n",
    "        accuracy=fraction_of_positives,\n",
    "        confidence=mean_predicted_value,\n",
    "    )\n",
    "    print(\"ECE (after calibration): {:.4f}\".format(ece_post_calibration))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x576 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_reliability_diagram(\n",
    "    calibration_data, lr_test_predictions, ece=[ece_post_calibration]\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As a final test, check if the accuracy of the model changes after calibration."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy of model before calibration: 0.73\n"
     ]
    }
   ],
   "source": [
    "y_pred = np.zeros(len(test_predictions))\n",
    "if use_platt:\n",
    "    # the true predictions are the probabilistic outputs\n",
    "    test_predictions = np.mean(np.array(all_test_probabilistic_predictions), axis=0)\n",
    "y_pred[test_predictions.reshape(-1) > 0.5] = 1\n",
    "print(\n",
    "    \"Accuracy of model before calibration: {:.2f}\".format(\n",
    "        accuracy_score(y_pred=y_pred, y_true=edge_labels_test)\n",
    "    )\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy for model after calibration: 0.81\n"
     ]
    }
   ],
   "source": [
    "y_pred = np.zeros(len(lr_test_predictions))\n",
    "y_pred[lr_test_predictions[:, 0] > 0.5] = 1\n",
    "print(\n",
    "    \"Accuracy for model after calibration: {:.2f}\".format(\n",
    "        accuracy_score(y_pred=y_pred, y_true=edge_labels_test)\n",
    "    )\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Conclusion\n",
    "\n",
    "This notebook demonstrated how to use Platt scaling and isotonic regression to calibrate a GraphSAGE model used for link prediction in a paper citation network. Importantly, it showed that using calibration can improve the classification model's accuracy."
   ]
  }
 ],
 "metadata": {
  "file_extension": ".py",
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.10"
  },
  "mimetype": "text/x-python",
  "name": "python",
  "npconvert_exporter": "python",
  "pygments_lexer": "ipython3",
  "version": 3
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
